home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 January: Mac OS SDK / Dev.CD Jan 99 SDK1.toast / Development Kits / AppleScript / Development Tools / Sample Code / 7Edit 3.1 / Sources / SVAERevert.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  3.6 KB  |  162 lines  |  [TEXT/CWIE]

  1. // SVAERevert.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAERevert.h"
  8.  
  9. #include "SVEditWindow.h"        // for DPtrFromWindowPtr()
  10. #include "SVEditFile.h"
  11.  
  12. #include "SVEditAEUtils.h"
  13. #include "SVAETextUtils.h"
  14. #include "SVAEAccessors.h"
  15. #include "SVAEDelete.h"
  16.  
  17. #pragma segment File
  18.  
  19.  
  20. // -----------------------------------------------------------------------
  21. //    Name:         DoRevert
  22. //    Purpose:    Handles the Revert AppleEvent.
  23. // -----------------------------------------------------------------------
  24.  
  25. pascal OSErr DoRevert(const AppleEvent    *theAppleEvent,
  26.                             AppleEvent     *reply,
  27.                             long        handlerRefCon)
  28. #pragma unused (reply, handlerRefCon)
  29.  
  30.     AEDesc            directObj = {typeNull, NULL};
  31.     WindowToken        aWindowToken;
  32.     OSErr            err;
  33.     
  34.         // pick up the direct object
  35.     err = AEGetParamDesc(theAppleEvent,  keyDirectObject, typeWildCard, &directObj);
  36.     
  37.     err = GotRequiredParams(theAppleEvent);
  38.     if (noErr != err) goto done;
  39.     
  40.     if (typeNull != directObj.descriptorType)
  41.         err = RevertDesc(&directObj);
  42.     else if (FrontWindow())                        // If no direct object given, default
  43.     {                                            // to the front window.
  44.         aWindowToken.tokenWindow = FrontWindow();
  45.         err = RevertWindowToken(&aWindowToken);
  46.     }
  47.     else
  48.         err = errAENoSuchObject;
  49.         
  50. done:
  51.     if (directObj.dataHandle) 
  52.         AEDisposeDesc(&directObj);
  53.         
  54.     return(err);
  55. } // DoRevertWindow
  56.  
  57.  
  58. OSErr     RevertWindowToken(WindowToken* theToken)
  59. {
  60.     DPtr            docPtr;
  61.     TextToken        aTextToken;
  62.     OSErr            err;
  63.     
  64.     docPtr = DPtrFromWindowPtr(theToken->tokenWindow);
  65.     
  66.     if (! docPtr)
  67.         return(errAENoSuchObject);
  68.  
  69.                         // Get a token for all the text in the window
  70.     err = TextTokenFromWindowToken(theToken, &aTextToken);
  71.     if (noErr != err) goto done;
  72.                         // Delete all the text
  73.     err = DeleteTextToken(&aTextToken);
  74.     if (noErr != err) goto done;
  75.  
  76.     if (docPtr->everSaved) 
  77.     {
  78.         err = GetFileContents(docPtr->theFSSpec, docPtr);
  79.         if (noErr != err) goto done;
  80.  
  81.         ResizeWindow(docPtr);
  82.         docPtr->dirty = false;
  83.     }
  84.  
  85.     DoUpdate(docPtr->theWindow);
  86.  
  87. done:
  88.     return(err);
  89. }
  90.  
  91.  
  92. OSErr    RevertWindowDesc(AEDesc* windowDesc)
  93. {
  94.     WindowToken        aWindowToken;
  95.     Size            actualSize;
  96.     OSErr            err;
  97.  
  98.     if (typeMyWndw != windowDesc->descriptorType)
  99.         return(errAETypeError);
  100.         
  101.     GetRawDataFromDescriptor(windowDesc, (Ptr)&aWindowToken, sizeof(aWindowToken), &actualSize);
  102.  
  103.     err = RevertWindowToken(&aWindowToken);
  104.     
  105.     return(err);
  106. }
  107.  
  108.  
  109. OSErr    RevertDesc(AEDesc* aDesc)
  110. {
  111.     AEDesc        revertDesc = {typeNull, NULL},
  112.                 windowDesc = {typeNull, NULL},
  113.                 itemDesc = {typeNull, NULL};
  114.     long        itemCount,
  115.                 index;
  116.     DescType    theAEKeyword;
  117.     OSErr        err;
  118.     
  119.     if (typeObjectSpecifier == aDesc->descriptorType)
  120.         err = AEResolve(aDesc, kAEIDoMinimum, &revertDesc);
  121.     else
  122.         err = AEDuplicateDesc(aDesc, &revertDesc);
  123.         
  124.     if (noErr != err) goto done;
  125.     
  126.     switch (revertDesc.descriptorType)
  127.     {
  128.         case typeAEList:
  129.             err = AECountItems(&revertDesc, &itemCount);
  130.             if (noErr != err) goto done;
  131.             
  132.             for (index = 1; index <= itemCount; index++)    // Do front back order
  133.             {
  134.                 err = AEGetNthDesc(&revertDesc, index, typeWildCard, &theAEKeyword, &itemDesc);
  135.                 if (noErr != err) goto done;
  136.                 
  137.                 err = RevertDesc(&itemDesc);    // Call recursively
  138.                 if (noErr != err) goto done;
  139.  
  140.                 if (itemDesc.dataHandle)
  141.                     AEDisposeDesc(&itemDesc);
  142.             }
  143.             break;
  144.             
  145.         default:
  146.             err = AECoerceDesc(&revertDesc, typeMyWndw, &windowDesc);
  147.             if (noErr != err) goto done;
  148.             err = RevertWindowDesc(&windowDesc);
  149.     }
  150.     
  151. done:
  152.     if (revertDesc.dataHandle)
  153.         AEDisposeDesc(&revertDesc);
  154.     if (windowDesc.dataHandle)
  155.         AEDisposeDesc(&windowDesc);
  156.     if (itemDesc.dataHandle)
  157.         AEDisposeDesc(&itemDesc);
  158.     
  159.     return(err);
  160. }
  161.